<?php

class Auth {

  	// données membres
  	protected static $auth = null;
  	protected $infosAuth = array();

  /**
   * Singleton pattern => rendre "new" inaccessible
   */
  	private function __construct() {
	  /**
	   * Si les infos d'authentification existent en session,
	   * alors les reprendre
	   * sinon créer un tableau vide
	   */
		if (isset($_SESSION['infosAuth'])) {
			$this->infosAuth = $_SESSION['infosAuth'];
		} else {
			$this->infosAuth = array();
		}
  	}
  
  /**
   * Singleton pattern => rendre "clone" impossible
   */
  	private function __clone() {}
  
  /**
   * Retourner l'instance de Auth
   */
  	public static function getInstance() {
		if (null === self::$auth) {
			self::$auth = new self();
		}
   	 	return self::$auth;
  	}
  
  

  /**
   * Méthode : verifierAuthentification
   * Vérifie si le couple (login, pwd) est correct
   * Si oui, remplit le tableau $this->infosAuthentification et 
   * l'enregistre en session (méthode synchronier())
   * Sinon, envoie une exception de type AuthException
   */
	public function verifierAuthentification($email, $passwd) {
		// construction, connexion et exécution de la requête
		$db = Outils_Bd::getInstance()->getConnexion();
		$sth = $db->prepare("SELECT * FROM User WHERE mail=:email and password=:passwd");
		$data = array ('email' => $email,
			   'passwd' => sha1($passwd));
		$sth->execute($data);
		$tab = $sth->fetchAll(PDO::FETCH_ASSOC);
	
		if (sizeof($tab) == 1) {
			// Test si compte désactivé
			if ($tab[0]['status']<0)
				return ERREUR_CPTE_DSCT;
		  	// identification correcte => renseigner les données membres
		  	$this->infosAuth = new User($tab[0]);
		  	$this->synchroniser();
		  	return CNX_OK;
		}
		else {
		  	// sinon erreur d'identification
		  	return ERREUR_MDP_LOGIN;
		  	//throw new Exception("Login ou mot de passe incorrect");
		}
	}
  
  
	/**
	 * Méthode estConnecte
	 * renvoie vrai si le tableau $this->infosAuth n'est pas vide
	 */
	public function estConnecte() {
	  	return !empty($this->infosAuth);
	}
  
  
	// renvoie tout le tableau (non utilisé)
	public function getInfosAuthentification() {
	  	return $this->infosAuth;
	}
  
  
	/**
	 * Déconnecte l'utilisateur en vidant le tableau $this->infosAuthentification
	 * et en réinitialisant les infos en session
	 */
	public function quitter() {
	  	$this->infosAuth = array();
	  	$this->synchroniser();
	}
  
	// synchronisation des infos de $this->infosAuthentification avec la session
	// à changer si on utilise autre chose pour conserver les infos
	private function synchroniser() {
	  	$_SESSION['infosAuth'] = $this->infosAuth;
	}
  
  } // fin classe Auth
  
?>